﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.ServiceModel;
using ServiceOfSansar.Models;

namespace ServiceOfSansar
{
    [ErrorHandler]
    [ServiceContract(Namespace = "Sansar")]
    [ServiceBehavior(InstanceContextMode = InstanceContextMode.Single, ConcurrencyMode = ConcurrencyMode.Multiple)]
    public class Register
    {
        #region Database
        private SansarEntities db;
        public Register()
        {
            db = new SansarEntities();
        }
        ~Register()
        {
            db.Dispose();
        }
        #endregion

        #region Хэрэглэгч бүртгэл
        [OperationContract] //Нэмэх
        public Result AddUser(Models.User usr)
        {
            if (db.Users.Where(w => w.UserId == usr.UserId).Count() > 0)
                return new Result() { Code = 2001, Message = string.Format("[{0}] дугаартай хэрэглэгч бүртгэлтэй байна!", usr.UserId) };
            if (db.Users.Where(w => w.Name.ToUpper().Equals(usr.Name.ToUpper())).Count() > 0)
                return new Result() { Code = 2001, Message = string.Format("[{0}] нэртэй хэрэглэгч бүртгэлтэй байна!", usr.Name) };
            db.Users.AddObject(usr);
            db.SaveChanges();
            return new Result() { Code = 0, Message = "Хэрэглэгчийг амжилттай бүртэглээ" };
        }

        [OperationContract] //Засах
        public Result EditUser(Models.User usr)
        {
            var u = db.Users.FirstOrDefault(w => w.UserId == usr.UserId);
            if (u == null)
                return new Result(2002, "Засах хэрэглэгчийн дугаар олдсонгүй!");

            u.Name = usr.Name;
            u.PositionNo = usr.PositionNo;
            u.Status = usr.Status;
            u.IsAuthentication = usr.IsAuthentication;
            db.SaveChanges();
            return new Result(0, "Бүртгэл амжилттай засагдлаа");
        }

        [OperationContract] //Устгах
        public Result DeleteUser(Models.User usr)
        {
            //Устгах хэрэглэгчийн бусад зүйлст холбоотойг шалгаж устгана
            var u = db.Users.FirstOrDefault(w => w.UserId == usr.UserId);
            if (u == null)
                return new Result(2002, "Устгах хэрэглэгчийн дугаар олдсонгүй!");

            db.Users.DeleteObject(u);
            db.SaveChanges();
            return new Result(0, "Бүртгэл амжилттай устгагдлаа");
        }



        [OperationContract] //Хэрэглэгчид бүлгийг зоож өгөх
        public Result JoinRole(int UserId, int[] Roles)
        {
            try
            {
                var list = db.UserAndRoles.Where(w => w.UserId == UserId).ToList();
                for (int i = 0; i < list.Count; i++)
                    db.UserAndRoles.DeleteObject(list[i]);
                db.SaveChanges();

                foreach (int r in Roles)
                {
                    var i = new UserAndRole() { RoleId = r, UserId = UserId };
                    db.UserAndRoles.AddObject(i);
                }
                db.SaveChanges();
                return new Result(0, "Амжилттай хадгаллаа");
            }
            catch (Exception ex)
            {
                return new Result(1, ex.Message);
            }
        }

        [OperationContract] //Хэрэглэгчийн жагсаалт
        public List<User> UserList()
        {
            return db.Users.ToList();
        }

        #endregion

        #region Эрхийн бүлэг
        [OperationContract]
        public List<Role> RoleList()
        {
            return db.Roles.ToList();
        }


        [OperationContract]
        public List<Roles> RoleAndPermissionList(int id)
        {
            List<Roles> list = null;
            list = (from p in db.Permissions
                    join r in (db.RoleAndPermissions.Where(p => p.RoleId == id).DefaultIfEmpty()) 
                    on p.PerId equals r.PerId 
                    into roles 
                    let rp=roles.DefaultIfEmpty()
                    from rs in rp
                    select new Roles()
                    {
                        Checked=rs.RoleId!=null,
                        PerId=p.PerId,
                        ParrentPerId=p.ParentId,
                        PerName=p.Description,
                        PerOrder=p.PerOrder??0                        
                    }).ToList();
            return list;
        }
        [OperationContract]
        public void SetRolePermission(bool check, int role_id, int per_id)
        {
            RoleAndPermission item = null;
            item = db.RoleAndPermissions.FirstOrDefault(w => w.RoleId == role_id && w.PerId == per_id);
            if (check == true && item == null)
            {
                db.RoleAndPermissions.AddObject(new RoleAndPermission() { PerId = per_id, RoleId = role_id });
            }

            else
                if (item != null)
                {
                    db.RoleAndPermissions.DeleteObject(item);
                }

            db.SaveChanges();


        }

        #endregion

        #region Байр бүртгэл
        [OperationContract] //Нэмэх
        public Result AddApartment(Models.Apartment apt)
        {
            if (db.Apartments.Where(w => w.ApartCode.ToUpper().Equals(apt.ApartCode.ToUpper())).Count() > 0)
                return new Result() { Code = 2001, Message = string.Format("[{0}] кодтой байр бүртгэлтэй байна!", apt.ApartCode) };
            db.Apartments.AddObject(apt);
            db.SaveChanges();
            return new Result() { Code = 0, Message = "Амжилттай бүртэглээ" };
        }
        [OperationContract] //Edit
        public Result EditApartment(Models.Apartment apt)
        {
            var u = db.Apartments.FirstOrDefault(w => w.Id == apt.Id);
            if (u == null)
                return new Result(2002, "Засах байр олдсонгүй!");
            u.ApartCode = apt.ApartCode;
            u.ApartNo1 = apt.ApartNo1;
            u.ApartNo2 = apt.ApartNo2;
            u.ApartOldCode = apt.ApartOldCode;
            u.BankBranchNo = apt.BankBranchNo;
            u.Description = apt.Description;
            u.KontorNo = apt.KontorNo;
            u.Latt = apt.Latt;
            u.Long = apt.Long;
            u.ObjectType = apt.ObjectType;
            u.ParentLinkCode = apt.ParentLinkCode;
            u.PartNo = apt.PartNo;
            u.PositionName = apt.PositionName;
            u.QuarterCode = apt.QuarterCode;
            u.SectionNo = apt.SectionNo;
            u.Status = apt.Status;
            u.ZipCode = apt.ZipCode;
            db.SaveChanges();
            return new Result(0, "Бүртгэл амжилттай засагдлаа");
        }
        [OperationContract] //Delete
        public Result DeleteApartment(Models.Apartment apt)
        {
            //Устгах хэрэглэгчийн бусад зүйлст холбоотойг шалгаж устгана
            var u = db.Apartments.FirstOrDefault(w => w.Id == apt.Id);
            if (u == null)
                return new Result(2002, "Устгах байр олдсонгүй!");
            db.Apartments.DeleteObject(u);
            db.SaveChanges();
            return new Result(0, "Бүртгэл амжилттай устгагдлаа");
        }
        [OperationContract] // Байр
        public Apartment GetApartment(long Id)
        {
            var ap = db.Apartments.FirstOrDefault(w => w.Id == Id);
            return ((Apartment)ap);
        }
        [OperationContract] // Байр
        public Apartment GetApartmentByCode(string ApartCode)
        {
            var ap = db.Apartments.FirstOrDefault(w => w.ApartCode == ApartCode);
            return ((Apartment)ap);
        }
        #endregion

        #region horoonii burtgel
        [OperationContract] //Horoo жагсаалт
        public Quarter GetQuarter(string QuarterCode)
        {
            return db.Quarters.FirstOrDefault(p => p.QuarterCode.Equals(QuarterCode));
        }
        #endregion

        #region Kass burtgel
        [OperationContract] //Horoo жагсаалт
        public BankBranch GetKass(int BankBranch)
        {
            return db.BankBranches.FirstOrDefault(p => p.BranchID == BankBranch);
        }
        #endregion

        #region Албан тушаал бүртгэл
        [OperationContract]
        public List<Position> PositionList()
        {
            return db.Positions.ToList();
        }
        #endregion

        #region Customer registration
        [OperationContract] //Нэмэх
        public Result AddCustomer(Models.Customer cust)
        {
            if (db.Customers.Where(c => c.CustRegister.Equals(cust.CustRegister)).Count() > 0)
                return new Result() { Code = 2001, Message = string.Format("[{0}] регистертэй хэрэглэгч бүртгэлтэй байна!", cust.CustRegister) };
            db.Customers.AddObject(cust);
            db.SaveChanges();
            return new Result() { Code = 0, Message = "Амжилттай бүртэглээ",RetData=cust.CustNo };
        }
        [OperationContract] //Edit
        public Result EditCustomer(Models.Customer c)
        {
            var u = db.Customers.FirstOrDefault(w => w.CustNo == c.CustNo);
            if (u == null)
                return new Result(2002, "Засах хэрэглэгч олдсонгүй!");
            u.CustCode = c.CustCode;
            u.CustName = c.CustName;
            u.CustRegister = c.CustRegister;
            u.CustType = c.CustType;
            u.ApartNo = c.ApartNo;
            u.DoorNo = c.DoorNo;
            u.Email = c.Email;
            u.ExtraInfo = c.ExtraInfo;
            u.Phones = c.Phones;
            u.Status = c.Status;
            db.SaveChanges();
            return new Result() { Code = 0, Message = "Амжилттай бүртэглээ", RetData = u.CustNo };
        }
        [OperationContract] //Delete
        public Result DeleteCustomer(Models.Customer c)
        {
            //Устгах хэрэглэгчийн бусад зүйлст холбоотойг шалгаж устгана
            var u = db.Customers.FirstOrDefault(w => w.CustNo == c.CustNo);
            if (u == null)
                return new Result(2002, "Устгах хэрэглэгч олдсонгүй!");
            
            db.Customers.DeleteObject(u);
            db.SaveChanges();
            return new Result(0, "Бүртгэл амжилттай устгагдлаа");
        }
        [OperationContract] //get
        public vw_Customers GetCustomer(long Id)
        {
            using (var db1 = new SansarEntities())
            {
                db1.ContextOptions.LazyLoadingEnabled = false;
                var c = db1.vw_Customers.FirstOrDefault(w => w.CustNo == Id);
                return c;     
            }
        }
        [OperationContract]
        public vw_Customers GetCustomerByReg(string reg)
        {
            using (var db1 = new SansarEntities())
            {
                db1.ContextOptions.LazyLoadingEnabled = false;
                var c = db1.vw_Customers.FirstOrDefault(w => w.CustRegister.Equals(reg));
                return ((vw_Customers)c);
            }
            
        }
        #endregion

        #region Contract registration
        [OperationContract] //Нэмэх
        public Result AddContract(Models.Contract cont, vw_ContractEquipment[] ItemEquips)
        {
            long contractNo = 0;
            if (cont.Company == "0")
            {
                var u = db.Settings.FirstOrDefault(w => w.Item == "CONTNO1");
                contractNo = u.ItemVal + 1;
            }
            else
            {
                var u = db.Settings.FirstOrDefault(w => w.Item == "CONTNO2");
                contractNo = u.ItemVal + 1;
            }
            cont.ContractNo = contractNo;
            if (db.Contracts.Where(c => c.ContractNo == cont.ContractNo).Count() > 0)
                return new Result() { Code = 2001, Message = string.Format("[{0}] дугаартай гэрээ бүртгэлтэй байна!", cont.ContractNo.ToString()) };
            UtmInterface utm = new UtmInterface();
            if(utm.UserExists(cont.UserName))
                return new Result() { Code = 2001, Message = string.Format(cont.UserName +" дугаартай хэрэглэгч UTM дээр бүртгэлтэй байна!", cont.ContractNo.ToString()) };
            db.Contracts.AddObject(cont);
            db.SaveChanges();

            if (cont.Company == "0")
            {
                var u = db.Settings.FirstOrDefault(w => w.Item == "CONTNO1");
                u.ItemVal = contractNo;
                db.SaveChanges();
            }
            else
            {
                var u = db.Settings.FirstOrDefault(w => w.Item == "CONTNO2");
                u.ItemVal = contractNo;
                db.SaveChanges();
            }

            //Save equipments
            if (ItemEquips.Length > 0)
            {
                db.ExecuteStoreCommand("DELETE ContractAndEquipment WHERE ContractNo=" + cont.ContractNo.ToString());
                db.SaveChanges();

                foreach (var item in ItemEquips)
                {
                    if(item.Quantity>0)
                    {
                        db.ContractAndEquipments.AddObject(new ContractAndEquipment()
                        {
                            ContractNo = cont.ContractNo,
                            EquipCode = item.EquipCode,
                            Quantity = item.Quantity,
                            Price = item.Price,
                            SerialCode = item.SerialCode,                        
                        });
                        //Console.WriteLine(item.EquipCode.ToString() + "    " + item.Name);
                    }
                }
                db.SaveChanges();
            }

            Result res;
            res = utm.addUser(cont.UserName, cont.Password);
            if (res.Code != 0)
                return new Result() { Code = 0, Message = "Гэрээг амжилттай бүртгэсэн боловч " + cont.UserName + " хэрэглэгчийг UTM дээр нэмж байх үед алдаа гарав!" + res.Message,RetData=cont.ContractNo };

            if (DateTime.Now.ToString("yyyyMMdd").Equals((cont.StartDate ?? DateTime.Now).ToString("yyyyMMdd")))
            {
                res = (new UtmInterface()).addServce(
                    cont.UserName,
                    cont.UserName,
                    cont.Password,
                    cont.CurrProdCode,
                    cont.StartDate,
                    cont.EndDate);
                if (res.Code != 0)
                    return new Result() { Code = 0, Message = "Гэрээг амжилттай бүртгэсэн боловч " + cont.UserName + "UTM-д хэрэглэгчийн service linke үүсгэж байх үед алдаа гарав!"+res.Message,RetData=cont.ContractNo };
            }

            //Save schedule
            //if (ItemSched.ContractNo != 0)
            //{
            //    ItemSched.ContractNo = cont.ContractNo;
            //    db.PaySchedules.AddObject(ItemSched);
            //    db.SaveChanges();

            //    db.SaveChanges();
            //}
            return new Result() { Code = 0, Message = "Гэрээг амжилттай бүртгэлээ!",RetData=cont.ContractNo};
        }
        [OperationContract] //Edit
        public Result CancelContract(Models.Contract c)
        {
            var u = db.Contracts.FirstOrDefault(w => w.ContractNo == c.ContractNo);

            if (u == null)
                return new Result( 1, "Цуцлах гэрээ олдсонгүй!");
            u.Status = 1;
            //u.StartDate = c.StartDate;
            db.SaveChanges();

            Result retItem = (new UtmInterface()).DeleteAllService(c.UserName);
            string retMsg="Амжилттай цуцаллаа!";
            if(retItem.Code==1)
                retMsg="Гэрээг цуцалсан боловч UTM дээр алдаа гарав! "+retItem.Message;
            return new Result { Code = 0, Message = retMsg, RetData = u.ContractNo };
        }
        [OperationContract] //Edit
        public Result EditContract(Models.Contract c)
        {
            var u = db.Contracts.FirstOrDefault(w => w.ContractNo == c.ContractNo);

            if (u == null)
                return new Result(1, "Засах гэрээ олдсонгүй!");

            Result retItem = new Result() { Code = 0, Message = "Амжилттай бүртэглээ", RetData = c.ContractNo };
            if (!string.IsNullOrEmpty(u.Password) && !string.IsNullOrEmpty(u.UserName)
                && !string.IsNullOrEmpty(c.UserName) && !string.IsNullOrEmpty(c.Password)
                && (u.Password != c.Password || u.UserName != c.UserName))
            {
                if ((new UtmInterface()).UserExists(c.UserName)==true && u.UserName != c.UserName)
                    return new Result() { Code = 1, Message = c.UserName + " дугаартай хэрэглэгч UTM дээр бүртгэлтэй байна!"};

                retItem = (new UtmInterface()).EditService(c.UserName, c.Password, u.UserName, u.Password);
            }

            u.ApartNo = c.ApartNo;
            u.Collector = c.Collector;
            u.ContDate = DateTime.Now;
            //u.CurrProdCode = c.CurrProdCode;
            u.CustNo = c.CustNo;
            u.Details = c.Details;
            u.DoorNo = c.DoorNo;
            //u.EndDate = c.EndDate;
            u.Phone = c.Phone;
            u.Mail = c.Mail;
            u.BillCode = c.BillCode;
            u.Company = c.Company;
            u.UserName = c.UserName;
            u.Password = c.Password;
            u.PayType = c.PayType;
            u.PayBank = c.PayBank;
            //u.StartDate = c.StartDate;
            db.SaveChanges();
            string retMsg = "Амжилттай бүртгэлээ!";
            if (retItem.Code == 1)
                retMsg = "Амжилттай бүртгэсэн боловч UTM дээр алдаа гарав! " + retItem.Message;
            return new Result { Code = retItem.Code, Message = retMsg, RetData = u.ContractNo };
        }
        [OperationContract] //ChangeContract
        public Result ChangeContract(Models.Contract cont, vw_ContractEquipment[] ItemEquips, PaySchedule ItemSched)
        {
            Result res=EditContract(cont);
            if (res.Code != 0) return res;
            //Save equipments
            if (ItemEquips.Length > 0)
            {
                int MaxCount = db.ContractAndEquipments.Where(w => w.ContractNo == cont.ContractNo).Max(p=>p.ContCount);                
                foreach (var item in ItemEquips)
                {
                    if (item.Quantity > 0)
                    {
                        db.ContractAndEquipments.AddObject(new ContractAndEquipment()
                        {
                            ContractNo = cont.ContractNo,
                            EquipCode = item.EquipCode,
                            Quantity = item.Quantity,
                            Price = item.Price,
                            SerialCode = item.SerialCode,
                            ContCount = MaxCount + 1
                        });
                        //Console.WriteLine(item.EquipCode.ToString() + "    " + item.Name);
                    }
                }
                db.SaveChanges();
            }
            res = new Result() { Code = 0 };
            if (DateTime.Now.ToString("yyyyMMdd").Equals((cont.StartDate ?? DateTime.Now).ToString("yyyyMMdd")))
            {
                res = (new UtmInterface()).addServce(
                    cont.UserName,
                    cont.UserName,
                    cont.Password,
                    cont.CurrProdCode,
                    cont.StartDate,
                    cont.EndDate);
            }
            if (res.Code != 0)
                return new Result() { Code = 0, Message = "Guilgee hiigdsen bolovch UTM interface deer aldaa garav! " + res.Message, RetData = cont.ContractNo };
            else
                return new Result() { Code = 0, Message = "Гүйлгээ амжилттай хийгдлээ", RetData = cont.ContractNo };

            //Save schedule
            //if (ItemSched.ContractNo != 0)
            //{
            //    ItemSched.ContractNo = cont.ContractNo;
            //    db.PaySchedules.AddObject(ItemSched);
            //    db.SaveChanges();
            //}
        }
        [OperationContract] //Delete
        public Result DeleteContract(Models.Contract c)
        {
            //Устгах хэрэглэгчийн бусад зүйлст холбоотойг шалгаж устгана
            var u = db.Contracts.FirstOrDefault(w => w.ContractNo == c.ContractNo);
            if (u == null)
                return new Result(1, "Устгах гэрээ олдсонгүй!");
            db.Contracts.DeleteObject(u);
            db.SaveChanges();

            Result retItem = (new UtmInterface()).DeleteAllService(c.UserName);
            string retMsg = "Амжилттай устгалаа!";
            if (retItem.Code == 1)
                retMsg = "Гэрээг устгасан боловч UTM дээр алдаа гарав! " + retItem.Message;
            return new Result { Code = 0, Message = retMsg, RetData = u.ContractNo };
        }
        [OperationContract] //get
        public Contract GetContract(int Id)
        {
            using (var db1 = new SansarEntities())
            {
                db1.ContextOptions.LazyLoadingEnabled = false;
                Contract con = db1.Contracts.FirstOrDefault(w => w.ContractNo == Id);
                return con;
            }
        }
        [OperationContract] //get
        public List<vw_ContractEquipment> GetContractEquipments(long ContNo)
        {
            return db.ExecuteStoreQuery<vw_ContractEquipment>(@"SELECT a.EquipCode, b.Name, a.SerialCode,a.Quantity, a.Price
                FROM ContractAndEquipment AS a INNER JOIN Equipment AS b ON a.EquipCode = b.EquipCode 
                WHERE ContractNo=" + ContNo.ToString()).ToList();
        }
        [OperationContract] //get
        public List<vw_ContractEquipment> GetProductEquipments(int ProdCode)
        {
            return db.ExecuteStoreQuery<vw_ContractEquipment>(@"SELECT a.EquipCode, b.Name, a.Quantity, '' AS SerialCode, a.Price
            FROM ProductAndEquipment AS a INNER JOIN Equipment AS b ON a.EquipCode = b.EquipCode 
            WHERE ProdCode=" + ProdCode.ToString()).ToList();
        }
        [OperationContract] //get
        public List<PaySchedule> GetContractSchedule(long ContNo)
        {
            return db.PaySchedules.Where(w => w.ContractNo == ContNo).ToList();
        }

        [OperationContract] //get
        public PaySchedule GetContractSchedule_contract(long ContNo)
        {
            var c = db.PaySchedules.FirstOrDefault(w => w.ContractNo == ContNo && w.IsContract == 1);
            return ((PaySchedule)c);
        }
        #endregion

        #region Бүтээгдэхүүн бүртгэл
        [OperationContract] //Нэмэх
        public Result AddProduct(Product prod)
        {
            if (db.Products.Where(w => w.ProdCode == prod.ProdCode).Count() > 0)
                return new Result() { Code = 2001, Message = string.Format("[{0}] дугаартай бүтээгдэхүүн бүртгэлтэй байна!", prod.ProdCode) };

            db.Products.AddObject(prod);
            db.SaveChanges();
            return new Result() { Code = 0, Message = "Амжилттай бүртэглээ" };
        }

        [OperationContract] //Засах
        public Result EditProduct(Product prod)
        {
            var p = db.Products.FirstOrDefault(w => w.ProdCode == prod.ProdCode);
            if (p == null)
                return new Result(2002, "Засах өгөгдөлийн дугаар олдсонгүй!");

            p.Price = prod.Price;
            p.InvoiceDay = prod.InvoiceDay;
            p.Name = prod.Name;
            p.Status = prod.Status;
            p.IsNewCustomer = prod.IsNewCustomer;
            p.ProdType = prod.ProdType;
            p.Length = prod.Length;
            p.NextProdCode = prod.NextProdCode;
            p.LengthOfAmount = prod.LengthOfAmount;
            p.UtmCode = prod.UtmCode;
            db.SaveChanges();
            return new Result(0, "Бүртгэл амжилттай засагдлаа");
        }

        [OperationContract] //Устгах
        public Result DeleteProduct(Product prod)
        {

            var u = db.Products.FirstOrDefault(w => w.ProdCode == prod.ProdCode);
            if (u == null)
                return new Result(2002, "Устгах өгөгдөл олдсонгүй!");

            //Энэ бүтээгдэхүүн ашиглагдсан зүйл байвал устгаж болохгүй

            db.Products.DeleteObject(u);
            db.SaveChanges();
            return new Result(0, "Бүртгэл амжилттай устгагдлаа");
        }
        [OperationContract] //get
        public Product GetProduct(int ProdCode)
        {
            var p = db.Products.FirstOrDefault(w => w.ProdCode == ProdCode);
            return ((Product)p);
        }


        [OperationContract]
        public List<ProductView> ProductList()
        {
            return db.Products
                .Join(db.ProductTypes, p => p.ProdType, t => t.ProdType, (p, t) =>
                    new ProductView()
                    {
                        CompanyNo = p.CompanyNo,
                        InvoiceDay = p.InvoiceDay,
                        IsNewCustomer = p.IsNewCustomer,
                        Length = p.Length,
                        LengthOfAmount = p.LengthOfAmount,
                        Name = p.Name,
                        NextProdCode = p.NextProdCode,
                        Price = p.Price,
                        PriceOfDay = p.PriceOfDay,
                        ProdCode = p.ProdCode,
                        ProdType = p.ProdType,
                        Status = p.Status,
                        TypeName = t.Name,
                        UtmCode=p.UtmCode
                    })
                .ToList();
        }



        [OperationContract] //Үйлчилгээ нэмж өгөх
        public Result JoinItem(ProductAndItem[] itms, int prod_code)
        {
            var del = db.ProductAndItems.Where(w => w.ProdCode == prod_code).ToArray();
            for (int i = 0; i < del.Count(); i++)
                db.ProductAndItems.DeleteObject(del[i]);
            db.SaveChanges();

            foreach (var it in itms)
            {
                db.ProductAndItems.AddObject(new ProductAndItem()
                {
                    ItemCode = it.ItemCode,
                    ProdCode = it.ProdCode,
                    Price = it.Price
                });
            }
            db.SaveChanges();
            return new Result(0, "Бүртгэл амжилттай хадгалагдлаа");
        }

        [OperationContract] //Төхөөрөмж нэмж өгөх
        public Result JoinEquip(ProductAndEquipment[] eqps, int prod_code)
        {
            var del = db.ProductAndEquipments.Where(w => w.ProdCode == prod_code).ToArray();
            for (int i = 0; i < del.Count(); i++)
                db.ProductAndEquipments.DeleteObject(del[i]);
            db.SaveChanges();

            foreach (var e in eqps)
            {
                db.ProductAndEquipments.AddObject(new ProductAndEquipment()
                {
                    EquipCode = e.EquipCode,
                    ProdCode = prod_code,
                    Price = e.Price,
                    Quantity = e.Quantity
                });
            }
            db.SaveChanges();
            return new Result(0, "Бүртгэл амжилттай хадгалагдлаа");
        }

        [OperationContract]
        public List<ProductsItem> ProductItems(int prod_code)
        {
            return db.ProductAndItems
                .Where(w => w.ProdCode == prod_code)
                .Join(db.Items, p => p.ItemCode, i => i.ItemCode, (p, i) => new
                {
                    Id = p.Id,
                    ItemCode = p.ItemCode,
                    ItemName = i.Name,
                    Price = p.Price,
                    ProdCode = p.ProdCode,
                    CatId = i.ItemCate
                })
                .Join(db.ItemCategories, t => t.CatId, c => c.ItemCate, (t, c) => new ProductsItem()
                {
                    Id = t.Id,
                    ItemCode = t.ItemCode,
                    ItemName = t.ItemName,
                    Price = t.Price,
                    ProdCode = t.ProdCode,
                    Category = c.Name
                })
                .ToList();
        }

        [OperationContract]
        public List<ProductsEquipment> ProductEquipments(int prod_code)
        {
            return db.ProductAndEquipments
                .Where(w => w.ProdCode == prod_code)
                .Join(db.Equipments, p => p.EquipCode, i => i.EquipCode, (p, i) => new ProductsEquipment()
                {
                    Id = p.Id,
                    EquipCode = p.EquipCode,
                    EquipmentName = i.Name,
                    Price = p.Price,
                    Unit = i.Unit,
                    ProdCode = p.ProdCode
                })
                .ToList();
        }

        #endregion

        #region Үйлчилгээ бүртгэл
        [OperationContract] //Нэмэх
        public Result AddItem(Models.Item itm)
        {
            if (db.Items.Where(w => w.ItemCode == itm.ItemCode).Count() > 0)
                return new Result() { Code = 2001, Message = string.Format("[{0}] дугаартай үйлчилгээ бүртгэлтэй байна!", itm.ItemCode) };

            db.Items.AddObject(itm);
            db.SaveChanges();
            return new Result() { Code = 0, Message = "Амжилттай бүртэглээ" };
        }

        [OperationContract] //Засах
        public Result EditItem(Models.Item itm)
        {
            var u = db.Items.FirstOrDefault(w => w.ItemCode == itm.ItemCode);
            if (u == null)
                return new Result(2002, "Засах өгөгдөлийн дугаар олдсонгүй!");

            u.Name = itm.Name;
            u.DefaultPrice = itm.DefaultPrice;
            u.Status = itm.Status;
            u.CompanyNo = itm.CompanyNo;
            u.Speed = itm.Speed;
            db.SaveChanges();
            return new Result(0, "Бүртгэл амжилттай засагдлаа");
        }

        [OperationContract] //Устгах
        public Result DeleteItem(Models.Item itm)
        {
            //Устгах хэрэглэгчийн бусад зүйлст холбоотойг шалгаж устгана
            var u = db.Items.FirstOrDefault(w => w.ItemCode == itm.ItemCode);
            if (u == null)
                return new Result(2002, "Устгах өгөгдөл олдсонгүй!");
            db.Items.DeleteObject(u);
            db.SaveChanges();
            return new Result(0, "Бүртгэл амжилттай устгагдлаа");
        }

        [OperationContract]
        public List<ItemRow> ItemList()
        {
            return db.Items
                .Join(db.ItemCategories, i => i.ItemCate, c => c.ItemCate, (i, c) => new
                    {
                        CategoryName = c.Name,
                        CompanyNo = i.CompanyNo,
                        DefaultPrice = i.DefaultPrice,
                        ItemCate = i.ItemCate,
                        ItemCode = i.ItemCode,
                        Name = i.Name,
                        Speed = i.Speed,
                        Status = i.Status
                    })
                .Join(db.Companies, i => i.CompanyNo, c => c.CompanyNo, (i, c) => new ItemRow()
                {
                    CategoryName = i.CategoryName,
                    CompanyNo = i.CompanyNo,
                    DefaultPrice = i.DefaultPrice,
                    ItemCate = i.ItemCate,
                    ItemCode = i.ItemCode,
                    Name = i.Name,
                    Speed = i.Speed,
                    Status = i.Status,
                    CompanyName = c.Name
                })
                .ToList();
        }
        #endregion

        #region Төхөөрөмж бүртгэл
        [OperationContract] //Нэмэх
        public Result AddEquipment(Models.Equipment itm)
        {
            if (db.Equipments.Where(w => w.EquipCode == itm.EquipCode).Count() > 0)
                return new Result() { Code = 2001, Message = string.Format("[{0}] дугаартай үйлчилгээ бүртгэлтэй байна!", itm.EquipCode) };

            db.Equipments.AddObject(itm);
            db.SaveChanges();
            return new Result() { Code = 0, Message = "Амжилттай бүртэглээ" };
        }

        [OperationContract] //Засах
        public Result EditEquipment(Models.Equipment eqp)
        {
            var u = db.Equipments.FirstOrDefault(w => w.EquipCode == eqp.EquipCode);
            if (u == null)
                return new Result(2002, "Засах өгөгдөлийн дугаар олдсонгүй!");

            u.Name = eqp.Name;
            u.Unit = eqp.Unit;
            u.Price = eqp.Price;
            u.Status = eqp.Status;
            u.CompanyNo = eqp.CompanyNo;
            db.SaveChanges();
            return new Result(0, "Бүртгэл амжилттай засагдлаа");
        }

        [OperationContract] //Устгах
        public Result DeleteEquipment(Models.Equipment eqp)
        {
            //Устгах хэрэглэгчийн бусад зүйлст холбоотойг шалгаж устгана
            var u = db.Equipments.FirstOrDefault(w => w.EquipCode == eqp.EquipCode);
            if (u == null)
                return new Result(2002, "Устгах өгөгдөл олдсонгүй!");
            db.Equipments.DeleteObject(u);
            db.SaveChanges();
            return new Result(0, "Бүртгэл амжилттай устгагдлаа");
        }

        [OperationContract]
        public List<EquipmentView> EquipmentList()
        {
            return db.Equipments
                .Join(db.Companies, e => e.CompanyNo, c => c.CompanyNo, (e, c) =>
                new EquipmentView()
                {
                    CompanyNo = e.CompanyNo,
                    EquipCode = e.EquipCode,
                    Name = e.Name,
                    Price = e.Price,
                    Status = e.Status,
                    Unit = e.Unit,
                    CompanyName = c.Name
                }).ToList();
        }
        #endregion

        #region Call Center бүртгэл
        [OperationContract]
        public Result AddCallRequest(CallRequest itm)
        {
            db.CallRequests.AddObject(itm);
            db.SaveChanges();
            return new Result() { Code = 0, Message = "Амжилттай бүртэглээ" };
        }

        [OperationContract] //Засах
        public Result EditCallRequest(CallRequest call)
        {
            var u = db.CallRequests.FirstOrDefault(w => w.ReqNo == call.ReqNo);
            if (u == null)
                return new Result(2002, "Засах өгөгдөлийн дугаар олдсонгүй!");

            u.Addition = call.Addition;
            u.DateOfClosed = call.DateOfClosed;
            u.DateOfPlaning = call.DateOfPlaning;
            u.LevelNo = call.LevelNo;
            u.StatusNo = call.StatusNo;
            u.UserNoOfClosed = call.UserNoOfClosed;
            u.UserNoOfDid = call.UserNoOfDid;
            u.Reason1 = call.Reason1;
            u.Reason2 = call.Reason2;
            u.Reason3 = call.Reason3;
            u.DistrictCode = call.DistrictCode;
            u.SectionNo = call.SectionNo;
            u.PartNo = call.PartNo;
            u.QuarterCode = call.QuarterCode;
            u.ApartNo = call.ApartNo;
            u.DoorNo = call.DoorNo;
            u.Network = call.Network;
            u.ComplaintTypeNo = call.ComplaintTypeNo;
            u.IsEngineer = call.IsEngineer;
            db.SaveChanges();
            return new Result(0, "Бүртгэл амжилттай засагдлаа");
        }


        [OperationContract] //Устгах
        public Result DeleteCallRequest(CallRequest call)
        {
            //Устгах хэрэглэгчийн бусад зүйлст холбоотойг шалгаж устгана
            var u = db.CallRequests.FirstOrDefault(w => w.ReqNo == call.ReqNo);
            if (u == null)
                return new Result(2002, "Устгах өгөгдөл олдсонгүй!");

            db.CallRequests.DeleteObject(u);
            db.SaveChanges();
            return new Result(0, "Бүртгэл амжилттай устгагдлаа");
        }

        [OperationContract] //Хаах
        public Result CloseCallRequest(CallComment comment,long req_no, string reason)
        {            
            var u = db.CallRequests.FirstOrDefault(w => w.ReqNo == req_no);
            if (u == null)
                return new Result(2002, "Хаах дуудлага олдсонгүй!");

            u.StatusNo = "CLS";
            db.CallComments.AddObject(comment);            
            db.SaveChanges();
            return new Result(0, "Дуудлагыг амжилттай хаалаа");
        }

        [OperationContract] //Жагсаалт        
        public List<vw_CallRequest> CallRequestList(string query)
        {

            using (SansarEntities db1 = new SansarEntities())
            {
                List<vw_CallRequest> res = null;

                if (string.IsNullOrEmpty(query))
                {
                    res = db1.vw_CallRequest.ToList();
                    return res;
                }
                else
                {
                    res = db1.vw_CallRequest.Where(query).ToList();
                    return res;
                }
            }
        }

        #endregion

        #region Call Center тайлбар
        [OperationContract] //Нэмэх
        public Result AddComment(CallComment itm)
        {
            var call = db.CallRequests.FirstOrDefault(w => w.ReqNo == itm.ReqNo);
            if (call == null)
                return new Result(2002, "Хүсэлтийн дугаар буруу байна");
            call.StatusNo = "PRS";
            db.CallComments.AddObject(itm);
            db.SaveChanges();
            return new Result() { Code = 0, Message = "Амжилттай бүртэглээ" };
        }

        [OperationContract] //Засах
        public Result EditComment(CallComment itm)
        {
            var u = db.CallComments.FirstOrDefault(w => w.CommentNo== itm.CommentNo);
            if (u == null)
                return new Result(2002, "Засах өгөгдөлийн дугаар олдсонгүй!");
            if (u.UserNo != itm.UserNo)
                return new Result(3001, "Тайлбар оруулсан ажилтан л засах боломжтой!");

            u.Comment = itm.Comment;            
            db.SaveChanges();
            return new Result(0, "Бүртгэл амжилттай засагдлаа");
        }

        [OperationContract] //Устгах
        public Result DeleteComment(CallComment itm)
        {
            //Устгах хэрэглэгчийн бусад зүйлст холбоотойг шалгаж устгана
            var u = db.CallComments.FirstOrDefault(w => w.CommentNo == itm.CommentNo);
            if (u == null)
                return new Result(2002, "Устгах өгөгдөл олдсонгүй!");
            db.CallComments.DeleteObject(u);
            db.SaveChanges();
            return new Result(0, "Бүртгэл амжилттай устгагдлаа");
        }

        [OperationContract]
        public List<CommentRow> CommentList(long req_no)
        {
            return db.CallComments.Where(w=>w.ReqNo==req_no)
                .Join(db.Users, i => i.UserNo, c => c.UserId, (i, c) => new CommentRow
                {
                    CommentNo = i.CommentNo,
                    CommentDate=i.CommentDate,
                    Comment=i.Comment,
                    UserName=c.Name,
                    UserNo=i.UserNo,
                    ReqNo=i.ReqNo
                })                
                .ToList();
        }
        #endregion

        #region Параметер бүртгэл
        [OperationContract]
        public Result AddParameter(Parameter para)
        {
            db.Parameters.AddObject(para);
            db.SaveChanges();
            return new Result() { Code = 0, Message = "Амжилттай бүртэглээ" };
        }

        [OperationContract] //Засах
        public Result EditParameter(Parameter para)
        {
            var u = db.Parameters.FirstOrDefault(w => w.ParaCode == para.ParaCode);
            if (u == null)
                return new Result(2002, "Засах өгөгдөлийн дугаар олдсонгүй!");

            u.Name = para.Name;
            u.Status = para.Status;
            db.SaveChanges();
            return new Result(0, "Бүртгэл амжилттай засагдлаа");
        }

        [OperationContract]
        public List<Parameter> ParameterList(string group_code)
        {
            using (SansarEntities se = new SansarEntities())
            {
                var list = se.Parameters.Where(w => w.ParentCode == null && w.GroupCode == group_code).ToList();
                return list;
            }
        }

        [OperationContract]
        public List<Parameter> ParameterGroupList()
        {
            return db.Parameters.Where(w => w.ParentCode == "H").ToList();
        }
        #endregion
    }
}
